package tec;
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;


public class Autobus implements Bus, Transport {

	int nbPlaceAssisesMax;
	int nbPlaceDeboutMax;
	int nbPlaceAssises=0;
	int nbPlaceDebout=0;
	int arret = 0;
	List <Passager> passagers;
	
	
	public Autobus(int assises, int debouts) {
		this.nbPlaceDeboutMax = debouts;
		this.nbPlaceAssisesMax = assises;
		passagers = new LinkedList <Passager>();
	}
	
	public boolean estDansBus(Passager p)
	{
		for(Passager pass : passagers) {
			if(pass == p)
				return true;
		}
		return false;
	}
	
	public boolean aPlaceAssise() {
		return (this.nbPlaceAssisesMax -this.nbPlaceAssises) > 0;
	}

	public boolean aPlaceDebout() {
		return (this.nbPlaceDeboutMax -this.nbPlaceDebout) > 0;
	}

	public void demanderPlaceAssise(Passager p) {
		this.nbPlaceAssises++;
		passagers.add(p);
		p.accepterPlaceAssise();
	}

	public void demanderPlaceDebout(Passager p) {
		this.nbPlaceDebout++;
		passagers.add(p);
		p.accepterPlaceDebout();
	}

	public void demanderChangerEnDebout(Passager p) {
		this.nbPlaceAssises--;
		this.nbPlaceDebout++;
		p.accepterPlaceDebout();
	}

	public void demanderChangerEnAssis(Passager p) {
		this.nbPlaceAssises++;
		this.nbPlaceDebout--;
		p.accepterPlaceAssise();
	}
	
	public void demanderSortie(Passager p) {
		if (p.estAssis()) {
			this.nbPlaceAssises--;
		} 
		else if(p.estDebout()) {
			this.nbPlaceDebout--;
		}
		passagers.remove(p);
		p.accepterSortie();
	}
	
	public void nouvelleSortie(Iterator<Passager> place, Passager aEnlever) {
		
		if (aEnlever.estAssis()) {
			this.nbPlaceAssises--;
		} 
		else if(aEnlever.estDebout()) {
			this.nbPlaceDebout--;
		}
		
		place.remove();
		
	
		aEnlever.accepterSortie();
	}
	
	public void allerArretSuivant() throws TecInvalidException{
		this.arret++;
		
		final Iterator<Passager> pIterator = passagers.iterator();

		Bus tempAutoBus = new Bus() {
			public boolean aPlaceAssise() 					{System.out.println("pouet"); return Autobus.this.aPlaceAssise(); }
			public boolean aPlaceDebout() 					{System.out.println("pouet"); return Autobus.this.aPlaceDebout(); }
			public void demanderPlaceAssise(Passager p)		{Autobus.this.demanderPlaceAssise(p);}
			public void demanderPlaceDebout(Passager p)		{Autobus.this.demanderPlaceDebout(p);}
			public void demanderChangerEnDebout(Passager p) {Autobus.this.demanderChangerEnDebout(p);}
			public void demanderChangerEnAssis(Passager p)  {Autobus.this.demanderChangerEnAssis(p);}
			public void demanderSortie(Passager p)			{Autobus.this.nouvelleSortie(pIterator, p);}
		};
		
		while(pIterator.hasNext()) {
			try {
				pIterator.next().nouvelArret(tempAutoBus, this.arret);
			} catch (IllegalStateException e) {
				throw new TecInvalidException(e);
			}
		}
	}
	
	public String toString() {
		return "[arret:" + arret + ", assis:" + nbPlaceAssises + ", debout:" + nbPlaceDebout + "]"; 
	}

}
